package com.examsys.dao;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;

import org.hibernate.Session;
import org.hibernate.query.Query;

import com.examsys.util.DBUtil;

//Serializable接口是java提供的通用数据保存和读取的接口
public abstract class AbstractBaseDao<T, K extends Serializable> implements IBaseDao<T, K> {
	
	public void add(T obj) throws Exception {
		DBUtil.getSession().save(obj);//用了hibernate保存添加的方法save来进行添加
		DBUtil.getSession().flush();
	}
	
	public void update(T obj) throws Exception {
		/*DBUtil.getSession().merge(obj);这一句是整合再修改，但在这里没起作用，可删掉*/
		DBUtil.getSession().update(obj);//修改
		DBUtil.getSession().flush();
	}
	
	public void delete(T obj) throws Exception {
		DBUtil.getSession().delete(obj);//删除
		DBUtil.getSession().flush();
	}
	
	public T get(Class<T> clasz, K k) throws Exception {
		return (T)DBUtil.getSession().get(clasz,k);//查询
	}
	
	/**
	 * 通过hql语句查找实体集合
	 */
	protected List<T> query(String hql, Object[] obj) throws Exception {
		Session session = DBUtil.getSession();
		Query<T> query = session.createQuery(hql);
		if (obj != null) {
			for (int i = 0; i < obj.length; i++) {
				query.setParameter(i, obj[i]);
			}
		}
		return query.getResultList();
	}
	
	/**
	   * 本方法用于执行查询，结果集中不允许重复，则只有一条记录
	   * @param sql 带参的数据库语句
	   * @param params 参数列表
	   * @return
	   * @throws Exception
	   * hsql="FROM admin where id=?"
	   */
	protected T uniqueQuery(String sql, Object[] params)
	          throws Exception {
	      List<T> list = query(sql, params);
	      if ((list != null) && (list.size() > 0)) {
	          return list.get(0);//这里这个零表示下标，只拿一条且是第一条的数据
	      }
	      return null;
	  }
	
	/**
	 * 获得系列值的方法
	 * select ADMIN_SEQ_ID from dual
	 */
	public Integer getSeq(String sql) throws Exception {
		Session session = DBUtil.getSession();
		BigDecimal seq= (BigDecimal)session.createNativeQuery(sql).getResultList().get(0);
		System.out.println(seq.intValue());
		return seq.intValue();
	}
	
	public void delete(String sql) throws Exception {
		DBUtil.getSession().createNativeQuery(sql).executeUpdate();
	}
	
}
